<?php
////////////////////////////////////////////////////////////////////////////
//                                                                        //
// NOTICE OF COPYRIGHT                                                    //
//                                                                        //
// Dean`s Office for Moodle                                               //
// Электронный деканат                                                    //
// <http://deansoffice.ru/>                                               //
//                                                                        //
// Copyright (C) 2008-2999  Massa					                      //
// 					                                                      //
// This program is free software: you can redistribute it and/or modify   //
// it under the terms of the GNU General Public License as published by   //
// the Free Software Foundation, either version 3 of the Licensen.        //
//                                                                        //
// This program is distributed in the hope that it will be useful,        //
// but WITHOUT ANY WARRANTY; without even the implied warranty of         //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          //
// GNU General Public License for more details.                           //
//                                                                        //
// You should have received a copy of the GNU General Public License      //
// along with this program.  If not, see <http://www.gnu.org/licenses/>.  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

//загрузка библиотек верхнего уровня
require_once(dirname(realpath(__FILE__))."/../../lib.php");

// подключаем форму
require_once('libform.php');

// устанавливаем контекст сайта (во всех режимах отображения по умолчанию)
// контекст имеет отношение к системе полномочий (подробнее - см. документацию Moodle)
// поскольку мы не пользуемся контекстами Moodle и используем собственную
// систему полномочий - все действия внутри блока dof оцениваются с точки зрения
// контекста сайта

$PAGE->set_context(context_system::instance());

// эту функцию обязательно нужно вызвать до вывода заголовка на всех страницах
require_login();

$addvars = array();

//задаем первый уровень навигации
$DOF->modlib('nvg')->add_level($DOF->get_string('title'), $DOF->url_im('standard','/index.php', $addvars));

/**
 * Собирает данные для страницы гостевой книги
 *
 */
class dof_im_imguestbook_page
{
    /**
     * Принцип работы:
     * 
     * 1. Проверяем поля GET-запроса.
     * 2. Формируем поля формы.
     * 3. Проверяем статус формы, в зависимости от POST-запроса.
     * 4. Выполняем POST-запрос.
     * 5. Создаем массив для вывода на экран.
     * 6. Отдаем массив в вызывающий метод.
     */
    
    /**
     * @var dof_control
     */
    protected $dof;
        
    /**
     * Конструктор
     * @param dof_control $dof - методы ядра системы
     * @return void
     */
    public function __construct(dof_control $dof)
    {
        $this->dof = $dof;

    }

    /**
     * Обрабатывает данные для представления на странице
     * Обрабатывает GET-запросы на удаление постов (вместе с комментариями) и отдельных комментариев, на добавление комментария, на редактирование поста
     * Обрабатывает статус формы, в зависимости от POST-запросов
     * Взаимодействует с таблицами плагинов storage для удаления, вставки, обновления и выборки постов и комментариев
     * Возвращает массив полей для вывода формы и таблицы сообщений гостевой книги на экран
     * @return array
     */
	public function handle_data() 
	{	//инициализируем переменные заголовка формы и базы url 
		$formdata['formtitle'] = $this->dof->get_string('add_post', 'imguestbook');
		$baseurl = $this->dof->url_im('imguestbook');

		//поступил GET-запрос на удаление поста: 
		if ( isset($_GET['del']) && is_numeric($_GET['del']) ) {
			$postid = abs((int)$_GET['del']);
		    if ( ! $this->dof->storage('gbmessages')->is_exists($postid) ) {
				//поста нет в базе, удалить не получится
		       	$this->dof->print_error('no_post_exists', $this->dof->url_im('imguestbook'), (int)$postid, 'im', 'imguestbook');
			} else {
				$this->dof->storage('gbmessages')->delete($postid);
				// заодно удаляем все комментарии к данному посту
				$this->dof->storage('gbcomments')->delete_all($postid);
				redirect($baseurl);
			}
		}

		//поступил GET-запрос на удаление комментария: 
		if ( isset($_GET['cdel']) && is_numeric($_GET['cdel']) ) {
			$comid = abs((int)$_GET['cdel']);
       		if ( ! $this->dof->storage('gbcomments')->is_exists($comid) ) {
				//комментария нет в базе, удалить не получится
            	$this->dof->print_error('no_comm_exists', $this->dof->url_im('imguestbook'), (int)$comid, 'im', 'imguestbook');
			} else {
			 	$this->dof->storage('gbcomments')->delete($comid);
				redirect($baseurl);
			}
		}

		//поступил GET-запрос на добавление комментария: 
		if ( isset($_GET['pid']) && is_numeric($_GET['pid']) ) {
			$pid = abs((int)$_GET['pid']);
      		if ( ! $this->dof->storage('gbmessages')->is_exists($pid) ) {
				//поста нет в базе, получить не удастся
           		$this->dof->print_error('no_post_exists', $this->dof->url_im('imguestbook'), (int)$pid, 'im', 'imguestbook');
			} else {
				//получаем пост для добавления комментария:
				$posttocom = $this->dof->storage('gbmessages')->get($pid);
				//измененияем поле заголовка формы, в данном случае, на строку "Комментировать"
				$formdata['formtitle'] = $this->dof->get_string('commentpost', 'imguestbook');
			}
		} else {
		 	//иначе отправляем в форме нулевое значение поля
			$pid = 0;
		}

		//поступил GET-запрос на редактирование поста: 
		if ( isset($_GET['edit']) && is_numeric($_GET['edit']) ) {
			$editid = abs((int)$_GET['edit']);
      		if ( ! $this->dof->storage('gbmessages')->is_exists($editid) ) {
				//поста нет в базе, получить не удастся
           		$this->dof->print_error('no_post_exists', $this->dof->url_im('imguestbook'), (int)$editid, 'im', 'imguestbook');
				redirect($baseurl);
			} else {
				//получаем пост для редактирования:
				$posttoedit = $this->dof->storage('gbmessages')->get($editid);
				//измененияем поле заголовка формы, в данном случае, на строку "Редактировать"
				$formdata['formtitle'] = $this->dof->get_string('editpost', 'imguestbook');	
				$postcontent = $posttoedit->post;
				$postname = $posttoedit->name;
				$arrfromstring = array();
				$arrfromstring['text'] = $postcontent;
				$arrfromstring['format'] = 1;
				$formdata['post'] = $arrfromstring;
				$formdata['name'] = $postname;
			}
		} else {
		 	//иначе отправляем в форме нулевое значение поля
			$editid = 0;
		}

		//инициализируем два общих поля формы: 
		$formdata['id'] = $editid;
		$formdata['pid'] = $pid;


		//создаем экземпляр формы
		$frm = new dof_im_imguestbook_gbform();

		//регистрируем значения полей в объекте формы
		$frm->set_data($formdata);

		//обрабатываем значения POST-запроса из формы
		//если нажата кнопка "Отмена"
		if($frm->is_cancelled()) {
			redirect($baseurl);

		//если были переданы данные из формы
		} else if ($fromform = $frm->get_data()) {

			//в поле "post" формы данные хранятся в ассоциативном массиве, сам введенный пользователем текст - в ячейке 'text'
			//поскольку для очистки и экранирования введенных данных используется функция mysqli_escape_string(), данные нужно привести к типу строки
			$fromform->post = $fromform->post['text'];

			//при сохранении комментария
			if ($fromform->pid) {
				//это поле реализует порядок вывода элементов страницы на экран и выбирает заголовок страницы
				$output['heading'] = 2;
				$fromform->comment = $fromform->post;
				$fromform->datetime = time();
				if ( ! $this->dof->storage('gbcomments')->insert($fromform) ) 
					print_error('inserterror', 'imguestbook');

			//при обновлении поста
			} else if ($fromform->id) {
				if ( ! $this->dof->storage('gbmessages')->update($fromform) ) 
					print_error('updateposterror', 'imguestbook');

			//при добавлении поста
			} else {
				$output['heading'] = 0;
				$fromform->datetime = time();
				if ( ! $this->dof->storage('gbmessages')->insert($fromform) ) 
					print_error('inserterror', 'imguestbook');

			}
			//редирект на страницу гостевой книги
			redirect($baseurl);

		//при первом отображении формы или если не прошла валидация данных
		} else {
			//сохраняем объект формы в выходном массиве
			$output['form'] = $frm;

			//при добавлении комментария, сверху выводим выбранный пост и все уже имеющиеся комментарии к нему 
			if ($pid) {
				$output['heading'] = 2;
				$postname = $posttocom->name;
				$postmessage = $posttocom->post;
				$dt = date("d-m-Y H:i:s", $posttocom->datetime);

				//формируем строку вывода html-таблицы в массиве
				$output['table'] = '<table align="center" border="1" frame="hsides" width="100%" cellpadding="10px">';

				//сначала ячейка поста
				$output['table'] .= '<tr>
										<td bgcolor="#ddd">
											<p>
												<b>'.$postname.'</b>  ('.$dt.')
												<br />'.$postmessage.'
											</p>	
										</td>
									</tr>';	

				$comments = $this->dof->storage('gbcomments')->get_records(array('pid' => $pid), $sort='id ASC');
										 
				foreach($comments as $comment) {
					$cid = $comment->id;
					$cname = $comment->name;
					$cmessage = $comment->comment;
					$cpid = $comment->pid;
					$cdt = date("d-m-Y H:i:s", $comment->datetime);

					//потом ячейки комментариев
					$output['table'] .= '<tr>
											<td bgcolor="#fff">
												<p>
													<b>'.$cname.'</b> ('.$cdt.')
													<br>'.$cmessage.'
												</p>
											</td>
										</tr>';
				}

				$output['table'] .= '</table><br>'; 

			//в остальных случаях, выводим форму и под ней таблицу с постами и комментариями 
			//посты выводятся в порядке "чем новее, тем выше", комментарии - в порядке добавления
			} else {
				if (($editid)) 
					$output['heading'] = 1;
				else
					$output['heading'] = 0;

				$gbposts = $this->dof->storage('gbmessages')->get_records(null, $sort='id DESC');
				$output['table'] = $this->dof->get_string('totalposts', 'imguestbook').count($gbposts);
				$output['table'] .= '<table align="center" border="1" frame="hsides" width="100%" cellpadding="10px">';

				foreach($gbposts as $gbpost){
					$id = $gbpost->id;
					$postname = $gbpost->name;
					$postmessage = $gbpost->post;
					$dt = date("d-m-Y H:i:s", $gbpost->datetime);

					$output['table'] .= '<tr>
											<td bgcolor="#ddd">
												<p>
													<b>'.$postname.'</b>  ('.$dt.')
													<br />'.$postmessage.'
												</p>
												<p align="right">
													<a href="'.$baseurl.'?edit='.$id.'">Редактировать</a>  |  
													<a href="'.$baseurl.'?del='.$id.'">Удалить</a>  | 
													<a href="'.$baseurl.'?pid='.$id.'">Комментировать</a>
												</p>
											</td>
										</tr>';

	
					$comments = $this->dof->storage('gbcomments')->get_records(array('pid' => $id), $sort='id ASC');
										 
					foreach($comments as $comment){
						$cid = $comment->id;
						$cname = $comment->name;
						$cmessage = $comment->comment;
						$cpid = $comment->pid;
						$cdt = date("d-m-Y H:i:s", $comment->datetime);

						$output['table'] .= '<tr>
												<td bgcolor="#fff">
													<p>
														<b>'.$cname.'</b> ('.$cdt.')
														<br>'.$cmessage.'
													</p>
													<p align="right">
														<a href="'.$baseurl.'?cdel='.$cid.'">Удалить</a>
													</p>
												</td>
											</tr>';
					}
				}

				$output['table'] .= '</table><br>';

			}

		}

		//отдаем сформированный массив
		return $output;
	}  

}

?>
